import { AttrTypeEnum, EntityTypeEnum, GTalent, IAttr, IState, Singleton } from "../Common";
import { LocalStorageTypeEnum } from "../Enum";
import BagManager from "./BagManager";
import DataManager from "./DataManager";
import { showToast } from "./MainManager";

/** 科技解锁状态 */
export enum TalentStateEnum {
    /** 锁着的 */
    lock,
    /** 解锁的 */
    unlock,
    /** 满级的 */
    maxLvl,
}

export class TalentManager extends Singleton {

    /** 科技对应等级 */
    private _talentData: { [id: number]: number } = null
    static get Ins() {
        return super.GetInstance<TalentManager>()
    }

    get talentData() {
        if (!this._talentData) {
            const str = localStorage.getItem(LocalStorageTypeEnum.talentData) || "{}"
            const data = JSON.parse(str)
            this._talentData = data
        }
        return this._talentData
    }

    setTalentData() {
        const data = JSON.stringify(this.talentData)
        localStorage.setItem(LocalStorageTypeEnum.talentData, data)
    }

    /** 获取科技解锁状态 */
    getTalentStateById(talentId: number | string) {

        const config = GTalent[talentId]
        const curLvl = this.talentData[talentId]
        const maxLvl = config.maxLvl

        if (!config.preSn) {
            if (maxLvl == curLvl) {
                return TalentStateEnum.maxLvl
            }
            return TalentStateEnum.unlock
        } else if (config.preSn.length) {
            if (maxLvl == curLvl) {
                return TalentStateEnum.maxLvl
            }
            for (const preSn of config.preSn) {
                const preMaxLvl = GTalent[preSn].maxLvl
                const preCurLvl = this.talentData[preSn] || 0
                if (!preCurLvl || preCurLvl < preMaxLvl) {
                    return TalentStateEnum.lock
                }
            }
        }
        return TalentStateEnum.unlock
    }

    /** 升级 */
    lvlUp(id: number) {
        if (!this.talentData[id]) {
            this.talentData[id] = 0
        }

        const talentState = TalentManager.Ins.getTalentStateById(id)
        switch (talentState) {
            case TalentStateEnum.maxLvl:
                showToast('已满级')
                return
            case TalentStateEnum.lock:
                showToast('未解锁')
                return
        }

        const currencyNumber = BagManager.Ins.getNumberById(EntityTypeEnum.scroll)
        if (currencyNumber < GTalent[id].cost) {
            showToast('科技卷不足')
            return
        }
        this.talentData[id]++
        this.setTalentData()

        BagManager.Ins.bagData[EntityTypeEnum.scroll] = currencyNumber - GTalent[id].cost
        BagManager.Ins.saveData()

    }

    /** 给人物添加上科技增加的属性 */
    setTalentAttribute(attr: IAttr) {
        for (const id in this.talentData) {
            const config = GTalent[id]
            const level = this.talentData[id]
            if (config.attrType) {
                attr[AttrTypeEnum[config.attrType]] += config.valueLvl * level
            }
        }

        return attr
    }

    /** 道具池子放入科技解锁的道具 */
    pushTalentPropPool() {
        // 战斗目镜
        if (this.talentData[32]) {
            DataManager.Ins.selectPool.push(19)

        }
        // 防弹衣
        if (this.talentData[35]) {
            DataManager.Ins.selectPool.push(12)

        }
    }

    /** 武器池子放入科技解锁的武器 */
    pushTalentWeaponPool() {
        // 重机枪
        if (this.talentData[38]) {
            DataManager.Ins.selectPool.push(9)
        }
        // awp
        if (this.talentData[41]) {
            DataManager.Ins.selectPool.push(10)
        }
    }

    /** 武器品质+1 */
    getWeaponStar() {
        return this.talentData[42] || 0
    }

    /** 科技点替换默认武器 */
    pointReplaceDefaultWeapon(state: IState) {
        if (this.talentData[39]) {
            state.weapons = []
            state.actors[0].skillPoint = 1
        }
        return state
    }

    /** 奖励选择提供一次刷新 */
    getRefreshSelect() {
        if (this.talentData[33]) {
            return true
        }
        return false
    }
    
    /** 无损 */
    getScrollTalent() {
        if (this.talentData[40]) {
            return true
        }
        return false
    }

    
}
